window.LocalStore = {
  get: function (key, defaultValue = null) {
    try {
      const value = localStorage.getItem(key);
      return value ? JSON.parse(value) : defaultValue;
    } catch (e) {
      return defaultValue;
    }
  },

  set: function (key, value) {
    localStorage.setItem(key, JSON.stringify(value));
  },

  /**
    * 更新
    * @param {string} key localStorage key
    * @param {function|any} updater 如果是函数，则传入 oldValue 返回新值，否则直接覆盖
    * @param {string} id 可选，数组里对象的唯一字段，用于去重
    */
  update: function (key, updater, id) {
    let oldValue = this.get(key, [])
    oldValue = Array.isArray(oldValue) ? oldValue : []

    let newValue = typeof updater === 'function' ? updater(oldValue) : updater

    // 如果有 id
    if (id && Array.isArray(newValue)) {
      const map = {}
      newValue.forEach(item => {
        if (item && item[id] != null) {
          map[item[id]] = item // 后添加的会覆盖前面重复的
        }
      })
      newValue = Object.values(map)
    }

    this.set(key, newValue)
    return newValue
  },

  remove: function (key) {
    localStorage.removeItem(key);
  },

  clear: function () {
    localStorage.clear();
  },

  // 🔥 删除数组中的某一条数据
  removeItem: function (key, predicate) {
    let list = this.get(key, []);
    if (!Array.isArray(list)) return;

    // 支持传 id 或 函数
    if (typeof predicate === "function") {
      list = list.filter(item => !predicate(item));
    } else {
      // 默认按照 id 删除
      list = list.filter(item => item.id !== predicate);
    }

    this.set(key, list);
  }
};
